package com.chinaunicom.sh.oss.antenna.code;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.chinaunicom.sh.oss.antenna.code.entity.County;
import com.chinaunicom.sh.oss.antenna.code.entity.KPI;
import com.xiaoka.camelv.entity.CamelvFtp;
import com.xiaoka.camelv.entity.CamelvGroovy;
import com.xiaoka.camelv.entity.CamelvHost;
import com.xiaoka.camelv.entity.CamelvHttp;
import com.xiaoka.camelv.entity.CamelvJdbc;
import com.xiaoka.camelv.entity.CamelvMail;
import com.xiaoka.camelv.entity.CamelvNode;
import com.xiaoka.camelv.entity.CamelvQueue;

/**
 * 根据java bean 生成 表<br/>
 * 
 * 使用步骤:<br/>
 * 1：添加不需要创建表字段的属性到 EXCLUDE_FILED_LIST 中<br/>
 * 2：添加bean与数据库表之间对应关系到 typeMap 中 <br/>
 * 3.修改表前缀(生成的表之前会添加表前缀) <br/>
 * 4.将需要生成SQL的类的Class放入list中，传入code方法中调用即可<br/>
 * 
 * @author liuchengbiao
 *
 */
public class GenerateTableUtil {

	/** 排除默认字段，针对这些字段，将不解析成属性，因为已经继承了 */
	public static final List<String> EXCLUDE_FILED_LIST = new ArrayList<String>(Arrays.asList("serialVersionUID"));

	/** 存储javaBean字段与表之前的数据类型对应关系,key:bean类型全路径，value:表字段类型 */
	public static Map<String, String> typeMap = new HashMap<String, String>();

	/** 表前缀 */
	public static final String TABLE_PREFFIX = "";

	static {
		/**
		 * 这里编写java bean 和 数据库表之间的数据类型对应关系<br/>
		 */
		typeMap.put("java.lang.String", "VARCHAR(64)");
		typeMap.put("java.lang.Integer", "int(64)");
		typeMap.put("java.lang.Float", "float");
		typeMap.put("java.util.Date", "datetime");
	}

	public static String code(List<Class> classList) {

		StringBuffer sb = new StringBuffer("");
		StringBuffer insertSb = new StringBuffer("");
		for (Class entity : classList) {
			List<TableEntity> list = getTableEntity(entity);
			String tableName = transToTableName(entity);
			// 生成SQL
			sb.append("-- ----------------------------").append("\n");
			sb.append("--  Table structure for `" + tableName + "`").append("\n");
			sb.append("-- ----------------------------").append("\n");
			sb.append("DROP TABLE IF EXISTS `" + tableName + "`;").append("\n");
			sb.append("CREATE TABLE `" + tableName + "` (").append("\n");

			// 生成ID
			sb.append("  `id` varchar(64) NOT NULL,").append("\n");
			// 循环属性生成
			for (TableEntity te : list) {
				// 生成字段
				sb.append("  ").append("`" + transToTableField(te.getColumnName()) + "`");
				// 生成类型
				sb.append(" ").append(typeMap.get(te.getType()));
				// 生成描述
				sb.append(" ").append("DEFAULT NULL");
				// 生成注释
				sb.append(" ").append("COMMENT \'\',");
				// 换行
				sb.append("\n");

				insertSb.append(transToTableField(te.getColumnName()) + ",");
			}
			// 生成框架需要的字段

			sb.append("  `create_by` varchar(64) DEFAULT NULL COMMENT '创建者',").append("\n");
			sb.append("  `create_date` datetime DEFAULT NULL COMMENT '创建时间',").append("\n");
			sb.append("  `update_by` varchar(64) DEFAULT NULL COMMENT '更新者',").append("\n");
			sb.append("  `update_date` datetime DEFAULT NULL COMMENT '更新时间',").append("\n");
			sb.append("  `remarks` varchar(255) DEFAULT NULL COMMENT '备注信息',").append("\n");
			sb.append("  `del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标记',").append("\n");
			// 设置主键
			sb.append("   PRIMARY KEY (`id`)").append("\n");
			sb.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8;").append("\n");

			sb.append("\n\n\n\n");

			System.out.println("添加语句:\n" + "insert info XXX(" + insertSb.toString() + ") values()");
		}

		return sb.toString();
	}

	/**
	 * 根据反射，获取属性<br/>
	 * 
	 * @param clazz
	 * @return
	 */
	public static List<TableEntity> getTableEntity(Class entity) {

		List<TableEntity> list = new ArrayList<TableEntity>();
		Field[] fields = entity.getDeclaredFields();
		for (Field field : fields) {
			String name = field.getName(); // 获取属性的名字
			// 排除不需要的字段
			if (EXCLUDE_FILED_LIST.contains(name)) {
				continue;
			}
			String type = field.getGenericType().toString();// 获取属性的类型

			TableEntity te = new TableEntity();
			te.setColumnName(name);
			// 去除前缀
			te.setType(type.split(" ")[1]);
			te.setRemark("");
			list.add(te);
		}
		return list;
	}

	/**
	 * 将属性字段转为表字段<br/>
	 * 
	 * @param field
	 * @return
	 */
	public static String transToTableField(String field) {

		StringBuffer sb = new StringBuffer("");
		char[] array = field.toCharArray();
		for (char c : array) {
			if (Character.isUpperCase(c)) {
				sb.append("_" + Character.toLowerCase(c));
				continue;
			}
			sb.append(c);
		}
		return sb.toString();
	}

	/**
	 * 根据实体Class解析出表名称<br/>
	 * 
	 * @param entity
	 * @return
	 */
	public static String transToTableName(Class entity) {
		String simpleName = entity.getSimpleName();
		char[] array = simpleName.toCharArray();
		StringBuffer sb = new StringBuffer("");
		for (int i = 0; i < array.length; i++) {
			if (Character.isUpperCase(array[i]) && i == 0) {
				sb.append(Character.toLowerCase(array[i]));
			} else if (Character.isUpperCase(array[i]) && i > 0) {
				sb.append("_" + Character.toLowerCase(array[i]));
			} else {
				sb.append(array[i]);
			}
		}
		return TABLE_PREFFIX + sb.toString();
	}

	/**
	 * 测试
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		List<Class> classList = new ArrayList<Class>();
		classList.add(CamelvNode.class);
		System.out.println(code(classList));
	}

}
